package com.ljx.List;

/**
 * @author 李加喜
 * @Package com.ljx.List
 * @date 2021-11-06 11:06
 */
// 判断是否有环  环的起点

import com.ljx.Dynamic.ListNode;

/**
 * 我们假设快慢指针相遇时，慢指针 slow 走了 k 步，那么快指针 fast 一定走了 2k 步：
 * 假设相遇点距环的起点的距离为 m，那么结合上图的 slow 指针，环的起点距头结点 head 的距离为 k - m，
 * 也就是说如果从 head 前进 k - m 步就能到达环起点。
 * 巧的是，如果从相遇点继续前进 k - m 步，也恰好到达环起点。因为结合上图的 fast 指针，
 * 从相遇点开始走k步可以转回到相遇点，那走 k - m 步肯定就走到环起点了：
 * 所以，只要我们把快慢指针中的任一个重新指向 head，然后两个指针同速前进，k - m 步后一定会相遇，
 * 相遇之处就是环的起点了。
 */
public class RiingListQi {
    public static void main(String[] args) {

    }
    ListNode detectCycle(ListNode head) {
        ListNode slow=head,first=head;
        while (first!=null && first.next!=null){
            slow=slow.next;
            first=first.next.next;
            if (slow==first){
                break;
            }
        }
        if (first==null || first.next==null){
            // 此时是空指针  所以没有环
            return null;
        }
        slow=head;
        // 快慢指针同步前进，相交点就是环起点
        while (slow!=first){
            slow=slow.next;
            first=first.next;
        }
        return slow;
    }
}
